package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.ruoyi.system.domain.MesMatbom;
import com.ruoyi.system.domain.MesWork;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.MesTaskCardMapper;
import com.ruoyi.system.mapper.MesTaskMapper;
import com.ruoyi.system.mapper.MesWorkMapper;
import com.ruoyi.system.domain.MesTaskCard;
import com.ruoyi.system.service.IMesTaskCardService;

/**
 * 车间任务卡Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-06-01
 */
@Service
public class MesTaskCardServiceImpl implements IMesTaskCardService 
{
    @Autowired
    private MesTaskCardMapper mesTaskCardMapper;

    @Autowired
    private MesWorkMapper mesWorkMapper;

    @Autowired
    private MesTaskMapper mesTaskMapper;

    /**
     * 查询车间任务卡
     * 
     * @param id 车间任务卡主键
     * @return 车间任务卡
     */
    @Override
    public MesTaskCard selectMesTaskCardById(Integer id)
    {
        return mesTaskCardMapper.selectMesTaskCardById(id);
    }

    /**
     * 查询车间任务卡列表
     * 
     * @param mesTaskCard 车间任务卡
     * @return 车间任务卡
     */
    @Override
    public List<MesTaskCard> selectMesTaskCardList(MesTaskCard mesTaskCard)
    {
        return mesTaskCardMapper.selectMesTaskCardList(mesTaskCard);
    }

    /**
     * 新增车间任务卡
     * 
     * @param mesTaskCard 车间任务卡
     * @return 结果
     */
    @Override
    public int insertMesTaskCard(MesTaskCard mesTaskCard)
    {
        return mesTaskCardMapper.insertMesTaskCard(mesTaskCard);
    }

    /**
     * 修改车间任务卡
     * 
     * @param mesTaskCard 车间任务卡
     * @return 结果
     */
    @Override
    public int updateMesTaskCard(MesTaskCard mesTaskCard)
    {
        return mesTaskCardMapper.updateMesTaskCard(mesTaskCard);
    }

    /**
     * 批量删除车间任务卡
     * 
     * @param ids 需要删除的车间任务卡主键
     * @return 结果
     */
    @Override
    public int deleteMesTaskCardByIds(Integer[] ids)
    {
        return mesTaskCardMapper.deleteMesTaskCardByIds(ids);
    }

    /**
     * 删除车间任务卡信息
     * 
     * @param id 车间任务卡主键
     * @return 结果
     */
    @Override
    public int deleteMesTaskCardById(Integer id)
    {
        return mesTaskCardMapper.deleteMesTaskCardById(id);
    }

    @Override
    public boolean isTaskCardIdUnique(MesTaskCard mesTaskCard, Boolean addOrUpdate)
    {
        int count = mesTaskCardMapper.countByTaskCardId(mesTaskCard.getTaskCardId());
        //添加bom，不允许表里有重复的
        if(addOrUpdate) {
            //如果记录为0条，就返回true否则返回false
            return count == 0;
        }
        //修改bom，允许表里有一条是重复的
        else {
            if(mesTaskCard.getTaskId().equals(mesTaskCard.getOldTaskId())){
                return count == 1;
            }
            else {
                return count == 0;
            }


        }
    }

    //车间任务拆卡
//    @Override
//    public int cardOpening(MesTaskCard mesTaskCard)
//    {
//        //
//        List<MesTaskCard> mtrs = mesTaskCard.getMtrs();
//        for (MesTaskCard mtr : mtrs) {
//            //1：处理数据
//            mtr.setTaskCardId(generateTaskCardCode(mtr.getTaskId()));//任务卡编码
//
//            mtr.setTaskId(mtr.getTaskId());//任务编码
//            mtr.setProdId(mtr.getProdId());//产品编码
//            mtr.setProcNum(mtr.getProcNum());//产品数量
//            mtr.setTaskTime(mtr.getTaskTime());//开始时间
//            mtr.setTaskFinTime(mtr.getTaskFinTime());//结束时间
//
//            //2.sql插入
//            mesTaskCardMapper.insertMesTaskCard(mtr);
//        }
//        return 1;
//        //return mesTaskCardMapper.insertMesTaskCard(mesTaskCard);
//    }
//
//    private String generateTaskCardCode(String taskId, int cardIndex) {
//        // 实现任务卡编码生成逻辑，
//        return taskId + "-" + String.format("%02d", cardIndex); // %02d 保证序号至少两位，不足前面补0
//    }

    //车间任务拆卡
    @Override
    public int cardOpening(MesTaskCard mesTaskCard) {
        List<MesTaskCard> mtrs = mesTaskCard.getMtrs();

        // 计算每个任务卡的编码后缀
        List<String> taskCardCodes = new ArrayList<>();
        for (int i = 0; i < mtrs.size(); i++) {
            taskCardCodes.add(generateTaskCardCodeSuffix(i + 1)); // 从1开始计数
        }

        // 遍历列表，设置任务卡编码并保存
        for (int i = 0; i < mtrs.size(); i++) {
            MesTaskCard mtr = mtrs.get(i);

            mtr.setTaskCardId(mesTaskCard.getTaskId() + taskCardCodes.get(i));//mtr.setTaskCardId(mtr.getTaskId() + taskCardCodes.get(i)); // 设置任务卡编码

            mtr.setTaskId(mesTaskCard.getTaskId());//mtr.setTaskId(mtr.getTaskId());
            mtr.setProdId(mtr.getProdId());//产品编码
            mtr.setProcNum(mtr.getProcNum());//加工数量
            mtr.setTaskTime(mtr.getTaskTime());//开始时间
            mtr.setTaskFinTime(mtr.getTaskFinTime());//结束时间

            mtr.setTaskCardStatus(0L);//任务状态  默认 为未完成 0
            mtr.setProductionSchedule(0L);//生产进度 默认为0

            //车间任务卡插入
            mesTaskCardMapper.insertMesTaskCard(mtr);

            //任务卡编码
            //工序编码   未知
            //已加工数（默认0）
            //待加工数（默认为总加工数）
            //生产进度（默认为0）

            //产品编码-产品表拿到-工艺编码-工艺工序表拿到所有工序
            mesWorkMapper.findProcessIdsByProdId(mtr.getProdId());

            List<String> processIds = mesWorkMapper.findProcessIdsByProdId(mtr.getProdId());

            for (String processId : processIds) {
                //System.out.println("工序ID: " + processId);
                MesWork mesWork = new MesWork();
                mesWork.setTaskCardId(mesTaskCard.getTaskId() + taskCardCodes.get(i));//任务卡编码
                mesWork.setProcessId(processId);//工序编码
                mesWork.setFinNum(0L);
                mesWork.setWaitNum(mtr.getProcNum());
                mesWork.setWorkSchedule(0L);
                //任务卡对应的工序插入
                mesWorkMapper.insertMesWork(mesWork);
            }

        }
        return mtrs.size();
    }

    // 生成编码后缀的方法
    private String generateTaskCardCodeSuffix(int index) {
        return String.format("-%02d", index); // 保证序号至少两位，不足前面补0
    }

    @Override
    public boolean workIsFinish(String taskId){
        if(mesTaskCardMapper.countByTaskIdAndStatusNot(taskId, 1) == 0){
            mesTaskMapper.updateTaskStatus(taskId);
            return true;
        }
        //return mesTaskCardMapper.countByTaskIdAndStatusNot(taskId, 1) == 0;
        return false;
    }
}
